import akshare as ak

from datetime import datetime
from easymoney.framework.mysql.core import db_factory
from easymoney.framework.mysql.core.db_factory import StockDistributionEntity


# 拉取最新的数据
def fetch_latest_daily_data(code):
    # 筹码分布
    df = ak.stock_cyq_em(symbol=code, adjust="")
    max_date_index = df['日期'].idxmax()
    # 获取昨天最新的一条数据
    row_with_max_age = df.loc[max_date_index]
    obj = query_by_code_date(code, row_with_max_age['日期'])
    if obj is not None and obj.date == datetime.now().date():
        return obj
    else:
        entity = StockDistributionEntity(
            stock_code=code,
            date=row_with_max_age['日期'],
            profit_ratio=row_with_max_age['获利比例'],
            average_cost=row_with_max_age['平均成本'],
            ninety_cost_low=row_with_max_age['90成本-低'],
            ninety_cost_high=row_with_max_age['90成本-高'],
            ninety_concentration=row_with_max_age['90集中度']  # 集中度数值越小，表明股票的成本越集中，这通常被认为是一个积极的信号。
            # 因为它表明大部分投资者在相近的价格水平买入股票，对未来股价的走势有着相对一致的预期。
        )
        # 保存到数据库
        with db_factory.db:
            # 在这里执行数据库操作
            try:
                entity.save()
            except Exception as e:
                print(e)


def fetch_all_data(code):
    mf = query_by_code(code)
    if mf is None:
        # 筹码分布
        df = ak.stock_cyq_em(symbol=code, adjust="")
        for index, row in df.iterrows():
            entity = StockDistributionEntity(
                stock_code=code,
                date=row['日期'],
                profit_ratio=row['获利比例'],
                average_cost=row['平均成本'],
                ninety_cost_low=row['90成本-低'],
                ninety_cost_high=row['90成本-高'],
                ninety_concentration=row['90集中度']  # 集中度数值越小，表明股票的成本越集中，这通常被认为是一个积极的信号。
                # 因为它表明大部分投资者在相近的价格水平买入股票，对未来股价的走势有着相对一致的预期。
            )
            # 保存到数据库
            with db_factory.db:
                # 在这里执行数据库操作
                entity.save()


def query_by_code(code):
    return StockDistributionEntity.get_or_none(StockDistributionEntity.stock_code == code)


def query_by_code_date(code, date):
    return StockDistributionEntity.get_or_none(
        StockDistributionEntity.stock_code == code, StockDistributionEntity.date == date)
